import { isiOS, isWechat } from './tools'
import request from '@/utils/request'
import store from '@/store'
import router from '@/router'

const BASE = 'https://wechat2.halobear.com/token' // 获取

// snsapi_base: 静默登录, 不需要用户同意, 可以拿到用户的 token, 不能拿到用户的个人信息
// snsapi_userinfo: 需要用户同意, 可以拿到用户的 token, 能拿到用户的个人信息
const SCOPE = 'snsapi_userinfo'

// 去掉一些微信登录后的标识，返回一个不含用户标识的路由
export function getTidyRoute(route) {
  const { name, params, query, hash } = route
  // 复制一份, 避免改动了 路由的数据
  const newQuery = Object.assign({}, query, {
    wechat_code: undefined,
    scope: undefined
  })
  return router.resolve({ name, params, query: newQuery, hash })
}

// 登陆地址
export function getLoginUrl(route) {
  let href, origin, url
  if (!route) {
    url = window.location.href.split('#')[0]
  } else {
    href = getTidyRoute(route).href
  }

  if (typeof window !== 'undefined') {
    // eslint-disable-next-line
    origin = window.location.origin
  }
  // 登陆成功后重定向的url
  const backUrl = encodeURIComponent(url || origin + href)
  return `${BASE}?scope=${SCOPE}&back=${backUrl}`
}

// 处理wechat_code
async function getUserInfo({ route, wechat_code }) {
  // 根据code获取用户信息
  const { data } = await request({
    url: '/api/client/v1/login',
    method: 'POST',
    data: { token: wechat_code }
  })
  const { user, token } = data

  // 保存登陆信息

  store.dispatch('login', { user, token })

  // 获取重定向位置
  const tidyRoute = getTidyRoute(route)

  if (isiOS && isWechat) {
    const { href } = tidyRoute
    // 在微信 iOS, 需要 location.href 才能更新 url
    window.location.replace(href)
    return
  }
  router.replace(tidyRoute)
}

// 主动登陆再登陆
export function login401(route) {
  const url = getLoginUrl(route)
  store.dispatch('logout')
  window.location.replace(url)
}

// 微信登陆
export default async function login({ route, next }) {
  const { isLogin } = store.state.user
  const { wechat_code, code } = route.query

  if (code) {
    store.dispatch('savePayCode', code)
  }

  // 不是微信，直接通过
  if (!isWechat) return next()

  // wechat_code 处理
  if (wechat_code) {
    if (isLogin) {
      // 已经登陆，重定向
      const query = { ...route.query }
      delete query.wechat_code
      next({ name: route.name, query })
      return
    } else {
      // 获取用户信息
      return await getUserInfo({ wechat_code, route })
    }
  }

  // 没有登陆，登陆
  if (!isLogin) {
    const url = getLoginUrl(route)

    window.location.replace(url)
    return
  }
  next()
}
